/**
 * 在这里定义和用户相关的路由处理函数，在/router/user.js进行调用
 * */

// 导入数据库模块，用于判断用户是否存在
const db = require("../db/index");

// bcrypt,用于对密码的加密,尽量不要让明文密码放入数据库
const bcrypt = require("bcryptjs");

// 一、注册新用户的处理函数
exports.reguser = (req, res) => {
  // 1.拿到客户端的个人信息
  const userinfo = req.body;

  // 2.判断是否为空
  if (!userinfo.username || !userinfo.password) {
    return res.cc("用户名或密码为空！");
  }

  // 3.判断用户是否已存在
  const queryStr = "select * from users where username = ?";
  db.query(queryStr, userinfo.username, (err, results) => {
    //  3.1 处理失败的情况
    if (err) {
      return res.cc(err);
    }
    if (results.length > 0) {
      return res.cc("用户已存在!请更换其他用户名!");
    }
  });

  // 4.如果不存在则插入

  // 4.1 插入之前先加密
  userinfo.password = bcrypt.hashSync(userinfo.password, 10);

  // 4.2 插入到数据库
  const insertStr = "insert into users set ?";
  db.query(insertStr, userinfo, (err, results) => {
    // 4.2.1 处理失败的情况
    if (err) {
      return res.cc(err);
    }
    if (results.affectedRows !== 1) {
      return res.cc("注册失败!请稍后再试!");
    }

    // 4.2.2 注册(插入)成功
    res.send({
      status: 0,
      message: "注册成功!",
    });
  });
};

// 二、用户登录的处理函数
exports.login = (req, res) => {
  // 1.拿到客户端的个人信息
  const userinfo = req.body;

  // 2.判断是否为空
  if (!userinfo.username || !userinfo.password) {
    return res.cc("用户名或密码为空！");
  }

  // 3.验证用户信息
  const queryStr = "select * from users where username = ?";
  db.query(queryStr, userinfo.username, (err, results) => {
    // 3.1 处理失败的情况(执行SQL 验证账号)
    if (err) {
      return res.cc(err);
    }
    if (results.length !== 1) {
      return res.cc("登陆失败!");
    }

    // 3.2 验证密码
    // 判断输入的密码是否和数据库中的一样,注意results是个长度为1的数组
    const compareResults = bcrypt.compareSync(
      userinfo.password,
      results[0].password
    );
    if (!compareResults) return res.cc("登陆失败!");

    // 3.3 登陆成功，生成token字符串
    // 3.3.1 剔除密码和头像，重要信息不能传输
    const user = { ...results[0], password: "", user_pic: "" };

    const jwt = require("jsonwebtoken");

    const config = require("../config");
    // 3.3.2 生成token时需要捆绑密钥一起进行签名
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: "10h" });

    // 3.3.3 返回登陆成功的消息
    res.send({
      status: 0,
      message: "登陆成功!",
      token: "bearer" + tokenStr,
    });
  });
};
